package com.qikux.service.impl;

import com.qikux.dao.UserDao;
import com.qikux.dao.UserScoreDao;
import com.qikux.entity.ScoreConfig;
import com.qikux.entity.User;
import com.qikux.entity.UserScore;
import com.qikux.service.UserService;
import com.qikux.vo.R;
import org.haredot.annotation.Resource;
import org.haredot.annotation.Service;
import org.haredot.annotation.Transactional;
import org.haredot.utils.MD5Utils;

import java.util.Objects;

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Resource
    private UserDao userDao ;

    @Resource
    private UserScoreDao userScoreDao ;

    @Override
    public R<Long> register(User user) {
        // 首先根据用户名查询用户是否已被注册
        User u = userDao.findUserByTel(user.getTel());

        // 如果 u 不为空，说明 手机号已被注册
        if (u != null) {
            return R.fail("手机号已被注册");
        }

        String password = user.getPassword();

        // 将密码进行 MD5 加密
        user.setPassword(MD5Utils.md5(password));

        // 保存用户到表中， 完成注册
        long pk = userDao.saveUser(user) ;
        return R.<Long>ok().data(pk);
    }

    @Override
    public R<?> modifyBaseUser(User user) {
        int len = userDao.updateBaseUser(user);
        if (len == 1) return R.ok();
        return R.fail("数据库异常");
    }

    @Override
    public R<User> queryUser(Long uid) {
        User user = userDao.findUserById(uid);
        return R.<User>ok().data(user);
    }

    @Override
    public R<?> activeUser(Long uid) {

        int len = userDao.updateState(uid, 1) ;

        if (len == 1) {
            String action = "用户注册" ;
            // 从 数据库 中查询 用户注册 动作 是否 需要赠送积分
            ScoreConfig config = userScoreDao.findScoreConfigByAction(action) ;

            if (config == null) {
                return R.ok();
            }

            // 如果查询到了，说明需要赠送 积分
            int score = config.getScore();
            // 赠送积分
            UserScore userScore = UserScore.builder()
                    .action(action)
                    .score(score)
                    .userId(uid)
                    .build();

            // 将数据存储到数据库中
            userScoreDao.saveUserScore(userScore) ;

            return R.ok();
        }

        return R.fail("账户已激活，请勿重复操作");
    }

    @Override
    public R<User> login(User user) {

        // 根据用户名，查询用户信息
        User userByTel = userDao.findUserByTel(user.getTel());

        if (userByTel == null) {
            return R.fail("用户名或密码不正确");
        }

        // 比较 数据库中的 密码 和 用户传入的 明文 密码是否一致
        String password = user.getPassword();

        if (!Objects.equals(MD5Utils.md5(password), userByTel.getPassword())) {
            return R.fail("用户名或密码不正确");
        }

        // 判断 账号 是否被禁用
        if (!userByTel.isState()) {
            return R.fail("账户被禁用");
        }

        return R.<User>ok().data(userByTel);
    }
}
